package com.example.home_app.util.MPAndroidChartUrils

import android.graphics.Color
import android.graphics.Matrix
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.Entry
import com.github.mikephil.charting.data.LineData
import com.github.mikephil.charting.data.LineDataSet
import com.github.mikephil.charting.formatter.IAxisValueFormatter
import java.util.*

/**
 * 图表工具
 * Created by yangle on 2016/11/29.
 */
object ChartUtils {
    var dayValue = 0
    var weekValue = 1
    var monthValue = 2

    /**
     * 初始化图表
     *
     * @param chart 原始图表
     * @return 初始化后的图表
     */
    fun initChart(chart: LineChart): LineChart {
        // 不显示数据描述
        chart.description.isEnabled = false
        // 没有数据的时候，显示“暂无数据”
        chart.setNoDataText("暂无数据")
        // 不显示表格颜色
        chart.setDrawGridBackground(false)
        // 不可以缩放
        chart.setScaleEnabled(true)
        // 不显示y轴右边的值
        chart.axisRight.isEnabled = false
        // 不显示图例
        val legend = chart.legend
        legend.isEnabled = false
        // 向左偏移15dp，抵消y轴向右偏移的30dp
        chart.extraLeftOffset = - 15f
        val xAxis = chart.xAxis
        // 不显示x轴
        xAxis.setDrawAxisLine(false)
        // 设置x轴数据的位置
        xAxis.position = XAxis.XAxisPosition.BOTTOM
        xAxis.textColor = Color.WHITE
        xAxis.textSize = 12f
        xAxis.gridColor = Color.parseColor("#30FFFFFF")
        // 设置x轴数据偏移量
        xAxis.yOffset = - 12f
        val yAxis = chart.axisLeft
        // 不显示y轴
        yAxis.setDrawAxisLine(false)
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(false)
        yAxis.textColor = Color.WHITE
        yAxis.textSize = 12f
        // 设置y轴数据偏移量
        yAxis.xOffset = 30f
        yAxis.yOffset = - 3f
        yAxis.axisMinimum = 0f
        val matrix = Matrix()
        // x轴缩放1.5倍
        //matrix.postScale(1.5f, 1f);
        // 在图表动画显示之前进行缩放
        //chart.getViewPortHandler().refresh(matrix, chart, false);
        // x轴执行动画
        chart.animateX(2500)
        chart.invalidate()
        return chart
    }

    /**
     * 设置图表数据
     *
     * @param chart  图表
     * @param values 数据
     */
    fun setChartData(chart: LineChart, values: List<Entry?>) {
        val lineDataSet: LineDataSet
        if (chart.data != null && chart.data.dataSetCount > 0) {
            lineDataSet = chart.data.getDataSetByIndex(0) as LineDataSet
            lineDataSet.values = values
            chart.data.notifyDataChanged()
            chart.notifyDataSetChanged()
        } else {
            lineDataSet = LineDataSet(values, "")
            // 设置曲线颜色
            lineDataSet.color = Color.parseColor("#FFFFFF")
            // 设置平滑曲线
            lineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER
            // 不显示坐标点的小圆点
            lineDataSet.setDrawCircles(false)
            // 不显示坐标点的数据
            lineDataSet.setDrawValues(true)
            // 不显示定位线
            lineDataSet.isHighlightEnabled = true
            val data = LineData(lineDataSet)
            chart.data = data
            chart.invalidate()
        }
    }

    /**
     * 更新图表
     *
     * @param chart     图表
     * @param values    数据
     * @param valueType 数据类型
     */
    fun notifyDataSetChanged(
        chart: LineChart, values: List<Entry?>,
        valueType: Int
    ) {
        chart.xAxis.valueFormatter =
            IAxisValueFormatter { value, axis -> xValuesProcess(valueType)[value.toInt()] }
        chart.invalidate()
        setChartData(chart, values)
    }

    /**
     * x轴数据处理
     *
     * @param valueType 数据类型
     * @return x轴数据
     */
    private fun xValuesProcess(valueType: Int): Array<String?> {
        val week = arrayOf("周日", "周一", "周二", "周三", "周四", "周五", "周六")
        if (valueType == dayValue) { // 今日
            val dayValues = arrayOfNulls<String>(7)
            var currentTime = System.currentTimeMillis()
            for (i in 6 downTo 0) {
                dayValues[i] = TimeUtils.dateToString(currentTime, TimeUtils.dateFormat_day)
                currentTime -= (5 * 1000).toLong()
            }
            return dayValues
        } else if (valueType == weekValue) { // 本周
            val weekValues = arrayOfNulls<String>(7)
            val calendar = Calendar.getInstance()
            var currentWeek = calendar[Calendar.DAY_OF_WEEK]
            for (i in 6 downTo 0) {
                weekValues[i] = week[currentWeek - 1]
                if (currentWeek == 1) {
                    currentWeek = 7
                } else {
                    currentWeek -= 1
                }
            }
            return weekValues
        } else if (valueType == monthValue) { // 本月
            val monthValues = arrayOfNulls<String>(7)
            var currentTime = System.currentTimeMillis()
            for (i in 6 downTo 0) {
                monthValues[i] = TimeUtils.dateToString(currentTime, TimeUtils.dateFormat_month)
                currentTime -= (4 * 24 * 60 * 60 * 1000).toLong()
            }
            return monthValues
        }
        return arrayOf()
    }
}